package _01_ArrayBasic;
/**
 * 插入复制
 * 上面的arraycopy是替换式复制
 * 如果需要在原有数组基础之上再进行添加数据,就是插入式复制
 *
 * 思路 :
 * 1.确定一个重点,既然是插入式复制,说明数组的长度一定会更改
 * 2.但是数组一旦确定,长度不能更改,如果需要更长的数组,就需要创建新的数组
 * 3.如果创建的是一个新的数组的话,该方法必须要有返回值,把这个新数组返回,否则调用处是没有办法获取插入数据之后的新数组的
 * 并且新数组的长度 为 目标数组的长度+插入的元素个数(dest.length+length)
 * 4.参数同上,还是五个
 * 		1.源数组
 * 		2.源数组起始位置
 * 		3.目标数组
 * 		4.目标数组起始位置
 * 		5.复制元素的个数
 * 
 * 5.如何实现功能
 *   1.把目标数组中起始位置之前的元素先放到新数组中
 *   2.再把源数组中起始位置开始到复制的个数之间的数据,放入新数组中
 *   3.最后把目标数组中起始位置之后的元素放入新数组中
 *   4.最终返回新数组
 * 
 * @author lenovo
 * @Date 2020年6月30日
 * @Time 下午9:37:52
 */
public class Array_07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] src = { 2, 3, 4, 5, 6, 7, 8 };
		int[] dest = { 11, 12, 13, 14, 15, 16, 17, 18 };

		int[] newDest = arraycopy(src, 2, dest, 3, 3);
		for (int i : newDest) {
			System.out.println(i);
		}
	}

	public static int[] arraycopy(int[] src, int srcPos, int[] dest, int destPos, int length) {
		// 1 确定一个重点,既然是插入式复制,说明数组的长度一定会更改
		// 2 但是数组一旦确定,长度不能更改,如果需要更长的数组,就需要创建新的数组
		// 3 如果创建的是一个新的数组的话,该方法必须要有返回值,把这个新数组返回,否则调用处是没有办法获取插入数据之后的新数组的
		// 并且新数组的长度 为 目标数组的长度+插入的元素个数(dest.length+length)
		int[] newDest = new int[dest.length + length];
		// 1 把目标数组中起始位置之前的元素先放到新数组中
		for (int i = 0; i <= destPos; i++) {
			newDest[i] = dest[i];
		}
		// 2 再把源数组中起始位置开始到复制的个数之间的数据,放入新数组中
		// 因为我们后面还需要用到destPos,所以我们不能更改destPos这个值
		// 但是我们循环放入需要 ++,所以把destPos的值,赋值给一个变量
		// 然后使用这个变量++,既能完成放入操作,还不会影响destPos的值
		int index = destPos;
		for (int i = srcPos; i < srcPos + length; i++) {
			index++;
			newDest[index] = src[i];
		}
		// 3 最后把目标数组中起始位置之后的元素放入新数组中
		for (int i = destPos + 1; i < dest.length; i++) {
			index++;
			newDest[index] = dest[i];
		}
		// 4 最终返回新数组
		return newDest;
	}

}
